import warnings
import numpy as np
warnings.filterwarnings('ignore')
Esta unidad es una introducción a una serie de conceptos básicos en el procesamiento de imágenes digitales.
Algunos aspectos importantes del sistema visual humano, incluida la formación de imágenes en el ojo y sus capacidades de adaptación y discriminación del brillo.
La luz, otros componentes del espectro electromagnético y sus características de imagen.
Los sensores de imágenes y cómo se utilizan para generar imágenes digitales.
Los conceptos de muestreo uniforme de imágenes y cuantificación de intensidad.
Relaciones básicas entre píxeles.
Una introducción a las principales herramientas matemáticas que utilizamos después.
Aunque el campo de procesamiento de imágenes está construido en fundamentos matemáticos, el análisis y la intuición humana muchas veces juegan un papel en la selección de una técnica contra otra.
Por ello, entender las características básicas de la percepción humana es un primer paso en nuestra jornada hacia el procesamiento de imágenes.
La retina cuenta con dos tipos de receptores: conos y bastones
Hay entre 6 y 7 millones de conos en cada ojo. Se encuentran localizados principalmente en la porción central de la retina, llamada fovea, y que es altamente sensible al color
Los humanos podemos resolver detalles finos debido a que cada cono está conectado a su propia terminal nerviosa
La visión proporcionada por los conos es llamada fotópica o visión de luz brillante
Contamos con un número mucho más grande de bastones, entre 75 y 150 millones se encuentran distribuidos en la retina
En 1666, Sir Isaac Newton descubrió que cuando un rayo de luz solar pasa a través de un prisma de vidrio, el rayo de luz que emerge no es blanco sino que consiste en un espectro continuo de colores que van desde el violeta en un extremo hasta el rojo en el otro.
La gama de colores que percibimos en la luz visible es una pequeña porción del espectro electromagnético.
En un extremo del espectro están las ondas de radio con longitudes de onda miles de millones de veces más largas que las de la luz visible. En el otro extremo del espectro se encuentran los rayos gamma con longitudes de onda millones de veces más pequeñas que las de la luz visible.
Sensor simple y sensor lineal
Matriz de sensores
Sensor rotativo
Arreglos de sensores
La salida de la mayoría de los sensores es un voltaje contino cuya amplitud y comportamiento espacial están relacionados con el fenómeno físico que está sensando.
Para crear una imagen digital, necesitamos convertir los datos continuos en un formato digital.
Esto requiere dos procesos: muestreo y cuantización.
Depende de la frecuencia de muestreo.
Es el número de elementos por unidad de longitud.
Depende de la cantidad de niveles de cuantización.
Es el número máximo de niveles posible que puede tener cada elemento en una imagen una vez digitalizada.
Resolución espacial y espectral
El resultado del muestreo y la cuantización es una matriz de números reales.
Los valores de las coordenadas de origen son (𝑥,𝑦)=(0,0).
Los siguientes valores a lo largo de la primera fila son: (𝑥,𝑦)=(0,1);(0,2);(0,3);…
Éstos no son valores reales de las coordenadas físicas cuando la imagen fue muestreada, sino los de la segunda (tercera, cuarta) muestra a lo largo de la primera fila.
Los niveles de quantización permitidos para cada pixel se representan por el número entero 𝐿.
Normalmente, con fines de facilitar el procesamiento, el almacenamiento y el muestreo, este número es, típicamente, una potencia de 2, es decir:
Entonces, el número de bits necesarios para almacenar dicha imagen es
La convención en la que la ubicación de un píxel está dada por sus coordenadas bidimensionales, se conoce como indexación de coordenadas o indexación de subíndices.
Otro tipo de indexación que se utiliza ampliamente en la programación de algoritmos de procesamiento de imágenes es la indexación lineal, que consiste en una cadena unidimensional de números enteros no negativos basada en el cálculo de compensaciones de las coordenadas (0, 0).
Hay dos tipos principales de indexación lineal, uno se basa en un escaneo de filas de una imagen y el otro en un escaneo de columnas.
La idea es escanear una imagen columna por columna, comenzando en el origen y avanzando hacia abajo y luego hacia la derecha. El índice lineal se basa en contar píxeles a medida que escaneamos la imagen como se muestra en la figura
La fórmula para generar índices lineales basados en un escaneo de columnas es sencilla y puede determinarse mediante inspección. Para cualquier par de coordenadas (x, y), el valor del índice lineal correspondiente es:
Intuitivamente, la resolución espacial es la medida de lo más pequeño que se puede describir en una imagen. Cuantitativamente, la resolución espacial puede ser definida de varias formas: con pares de líneas por unidad de distancia, y puntos por unidad de distancia son los más comunes.
La resolución de intensidad se refiere de manera similar al cambio más pequeño discernible en el nivel de intensidad.
Según consideraciones de hardware, el número de niveles de intensidad suele ser una potencia entera de dos. El número más común es de 8 bits, aunque se utilizan 16 bits en algunas aplicaciones en las que es necesario mejorar rangos de intensidad específicos. La cuantificación de intensidad utilizando 32 bits es poco común.
A diferencia de la resolución espacial, que debe basarse en una base por unidad de distancia para que sea significativa, es una práctica común referirse al número de bits utilizados para cuantificar la intensidad como “resolución de intensidad”.
Por ejemplo, es común decir que una imagen cuya intensidad está cuantificada en 256 niveles tiene 8 bits de resolución de intensidad. Sin embargo, tenga en cuenta que los cambios discernibles de intensidad también están influenciados por los valores de ruido y saturación, y por las capacidades de la percepción humana para analizar e interpretar detalles en el contexto de una escena completa.
La interpolación se utiliza en tareas como hacer zoom, reducir, rotar y corregir geométricamente imágenes digitales. Por ahora la aplicaremos al cambio de tamaño de imágenes (reducción y zoom), que son básicamente métodos de remuestreo de imágenes.
La interpolación es el proceso de utilizar datos conocidos para estimar valores en ubicaciones desconocidas.
Supongamos que una imagen de tamaño 500 500 píxeles debe ampliarse 1,5 veces a 750 750 píxeles.
Este método se llama interpolación del vecino más cercano, porque asigna a cada nueva ubicación la intensidad de su vecino más cercano en la imagen original. Este enfoque es simple pero tiende a producir artefactos indeseables, como una distorsión severa de los bordes rectos.
Un enfoque más adecuado es la interpolación bilineal, en la que utilizamos los cuatro vecinos más cercanos para estimar la intensidad en una ubicación determinada.
El siguiente nivel de complejidad es la interpolación bicúbica, que involucra a los dieciséis vecinos más cercanos de un punto.
Un pixel en las coordenadas tiene dos vecinos horizontales y dos vecinos verticales con coordenadas:
A este conjunto de pixeles se le llama el conjunto de 4-vecinos de , y se denota por
Pero tiene otros cuatro vecinos diagonales, denotado :
Estos vecinos, junto con los otros cuatro, se llaman los 8-vecinos de , denotado por:
El conjunto de ubicaciones de imágenes de los vecinos de un punto se llama vecindad de . Se dice que el vecindario está cerrado si contiene a . De lo contrario, se dice que el vecindario está abierto.
Sea El conjunto de valores de intensidad utilizados para definir la adyacencia. Por ejemplo, en una imagen binaria
Un camino (o curva) del pixel con coordenadas , al pixel con coordenadas , es una secuencia de pixeles distintos con coordenadas
dónde los puntos y son adyacentes para . Donde es la longitud de el camino.
Si el camino es un camino cerrado.
Se pueden definir , o -caminos, dependiendo del tipo de adyacencia que se utilice.
Sea un subconjunto de píxeles de una imagen. Se dice que dos píxeles están conectados en si existe un camino entre ellos que consta enteramente de píxeles en .
Para cualquier píxel , el conjunto de píxeles que están conectados a él en se denomina componente conectado de . Si solo tiene un componente y ese componente es conexo, entonces se llama conjunto conexo.
Sea un subconjunto de píxeles de una imagen. Llamamos a una región de la imagen si es un conjunto conexo.
Supongamos que una imagen contiene regiones disjuntas, , ninguna de las cuales toca el borde de la imagen. Sea la unión de todas las regiones, y sea su complemento.
El límite (también llamado borde o contorno) de una región es el conjunto de píxeles en que son adyacentes a píxeles en el complemento de .
Dicho de otra manera, el borde de una región es el conjunto de píxeles en la región que debe tener al menos un vecino del fondo.
La definición anterior define el borde interior de la región para distinguirla de su borde exterior, que es el borde correspondiente en el fondo.
Si resulta ser la imagen completa, entonces su límite (o borde) se define como el conjunto de píxeles en la primera y última fila y columna de la imagen.
Esta definición adicional es necesaria porque una imagen no tiene vecinos más allá de su borde.
Normalmente, cuando nos referimos a una región, nos referimos a un subconjunto de una imagen, y cualquier píxel en el límite de la región que coincida con el borde de la imagen se incluye implícitamente como parte del límite de la región.
Para los pixeles , y , con coordenadas , y respectivamente; es una función de distancia o métrica si
Para esta medida de distancia, los píxeles que tienen una distancia menor o igual a algún valor desde son los puntos contenidos en un disco de radio centrado en .
También llamada distancia city-block, está definida como:
En este caso, los píxeles que tienen una distancia desde que es menor o igual a algún forma de diamante valorada centrada en . Por ejemplo, los píxeles con una distancia desde (el punto central) forman lo siguiente contornos de distancia constante:
También llamada distancia chessboard, esta definida como:
En este caso, los píxeles con una distancia desde menor o igual a algún valor forman un cuadrado centrado en . Por ejemplo, los píxeles con distancia forman los siguientes contornos de distancia constante:
Tenga en cuenta que las distancias y entre y son independientes de cualquier camino que pueda existir entre estos puntos porque estas distancias involucran solo las coordenadas de los puntos.
Las operaciones por elementos que involucra una o más imágenes se lleva a cabo píxel por píxel.
Anteriormente mencionamos que las imágenes pueden verse de manera equivalente como matrices. De hecho, como verá más adelante en esta sección, hay muchas situaciones en las que las operaciones entre imágenes se llevan a cabo utilizando la teoría de matrices.
Es por esta razón que se debe hacer una clara distinción entre operaciones por elementos y matriciales. Por ejemplo, considere las siguientes imágenes (matrices) de :
El producto por elemento (denotado por o por ) será
Por otro lado el producto matriz de las imágenes se obtiene utilizando las reglas de la multiplicación de matrices
Una de las clasificaciones más importantes de un método de procesamiento de imágenes es si es lineal o no lineal. Considere un operador general, , que produce una imagen de salida, , a partir de una imagen de entrada dada, :
Dadas dos constantes arbitrarias, y , y dos imágenes arbitrarias y , Se dice que es un operador lineal si
Esta ecuación indica que el resultado de una operación lineal aplicada a la suma de dos entradas es lo mismo que realizar la operación individualmente en las entradas y luego sumar los resultados.
Además, el resultado de una operación lineal sobre una constante multiplicada por una entrada es el mismo que el resultado de la operación debido a la entrada original multiplicada por esa constante.
La primera propiedad se llama propiedad de aditividad y la segunda se llama propiedad de homogeneidad.
Por definición, si un operador falla en satisfacer la ecuación anterior, se dice que es no lineal.
Como ejemplo, supongamos que es el operador sumatorio .
Para probar su linealidad comenzamos describiendo el lado izquierdo de la ecuación anterior, para tratar de demostrar que es igual a la parte de la derecha.
Ahora probemos cuando es la operación . Para ello lo haremos con un pequeño ejemplo. Considere las dos imagenes
y supongamos que y . Para verificar la linealidad, calculamos el lado izquierdo de la ecuación
ahora para el lado derecho de la ecuación
Los lados izquierdo y derecho de la ecuación no son iguales en este caso, entonces hemos probado que el operador es no lineal.
Las operaciones aritméticas entre dos imágenes y son denotadas como
Éstas operaciones se realizan por el elemento, como se ha descrito anteriormente. Evidentemente la aritmética de imágenes implica que solo se pueden operar imágenes del mismo tamaño.
from skimage.io import imread, imshow
from skimage import data
astro = data.astronaut()
astro_gris = data.astronaut()[:,:,1]
imshow(astro_gris)
<matplotlib.image.AxesImage at 0x11da05010>
from skimage.io import imread, imshow
import matplotlib.pyplot as plt
%matplotlib inline
lena = imread('figs/lena.jpg')
lena_gris = lena[:,:,1]
imshow(lena_gris)
<matplotlib.image.AxesImage at 0x11da74b90>
sum = astro_gris + lena_gris
imshow(sum)
<matplotlib.image.AxesImage at 0x11dad1990>
dif = astro_gris - lena_gris
imshow(dif)
<matplotlib.image.AxesImage at 0x11db4fbd0>
prod = astro_gris * lena_gris
imshow(prod)
<matplotlib.image.AxesImage at 0x11db79850>
div = astro_gris / lena_gris
imshow(div)
<matplotlib.image.AxesImage at 0x11dc3c3d0>
Si es un elemento de , entonces se puede escribir
Análogamente, si no es un elemento de
El conjunto que no contiene elementos es llamado conjunto vacío y se denota por
un conjunto de notando por su contenido dentro de llaves . Por ejemplo
que quiere decir que es el conjunto de elementos , tal que está formado por el negativo de cada uno de los elementos en el conjunto
Si cada elemento del conjunto también este elemento del conjunto , entonces se dice que es un subconjunto de , y se denota como
La unión de dos conjuntos y es un conjunto que contiene los elementos pertenecientes a o a o a ambos.
Similarmente, el conjunto que consiste de los elementos que pertenecen a ambos conjuntos y , se le llama intersección de y
Se dice que dos conjuntos y son disjuntos mutuamente exclusivos si no tienen elementos en común, es decir
El espacio de muestra (también llamado conjunto universo) es el conjunto de todos los posibles elementos de todos los conjuntos en una aplicación.
El complemento de un conjunto es el conjunto de elementos que no están en
A diferencia de dos conjuntos y , como , está definida como
| Descripción | Expresiones |
|---|---|
| Operaciones entre el universo y conjuntos vacíos | |
| Unión e intersección con el vacío y el universo | |
| Unión e intersección de un conjunto con él mismo |
| Descripción | Expresiones |
|---|---|
| Unión e intersección de un conjunto con su complemento | |
| Leyes conmutativas | |
| Leyes asociativas | |
| Leyes distributivas | |
| Leyes de DeMorgan |
El producto cartesiano de dos conjuntos y , de notado como , es el conjunto de todos los pares ordenados en los cuales el primer elemento es miembro de el conjunto y el segundo componente es miembro del conjunto
Una relación (más precisamente, una relación binaria) en un conjunto es una colección de pares ordenados elementos de . Esto es, una relación binaria es un subconjunto del producto cartesiano .
Una relación binaria entre dos conjuntos y es un subconjunto de .
Un órden parcial en un conjunto es una relación en , tal que es
Un conjunto con un orden parcial se llama conjunto parcialmente ordenado.
Sea el símbolo que denota una relación de órden parcial. Una expresión de la forma
se lee como: precede o es igual a , precede o es igual a , etc. Trabajando con números, utilizamos símbolos conocidos como menor o igual que (denotado por ).
Un órden estricto en el conjunto es una relación en , tal que es
Un conjunto con un orden parcial se llama conjunto parcialmente ordenado.
Sea el símbolo que denota una relación de órden estricto. Una expresión de la forma
se lee como: precede a , precede a , etc. Trabajando con números, utilizamos símbolos conocidos como menor que (denotado por ).
Las operaciones lógicas tratan con variables y expresiones VERDADERAS (normalmente indicadas por 1) y FALSAS (normalmente indicadas por 0). Para nuestros propósitos, esto significa imágenes binarias compuestas por píxeles de primer plano (con valor 1) y un fondo compuesto por píxeles con valor 0.
Trabajamos con operadores lógicos y de conjuntos en imágenes binarias usando uno de dos enfoques básicos:
podemos usar las coordenadas de regiones individuales de píxeles de primer plano en una sola imagen como conjuntos. Aquí, una imagen binaria se puede ver como un diagrama de Venn en el que las coordenadas de regiones individuales de píxeles de valor 1 se tratan como conjuntos.
podemos trabajar con uno o más imágenes del mismo tamaño y realizar operaciones lógicas entre los píxeles correspondientes en esas matrices. Aquí, realizamos operaciones lógicas en los píxeles de una imagen binaria, o en los píxeles correspondientes de dos o más imágenes binarias del mismo tamaño.
Los operadores lógicos se pueden definir en términos de tablas de verdad.
| 0 | 0 | 0 | 0 | 1 |
| 0 | 1 | 0 | 1 | 1 |
| 1 | 0 | 0 | 1 | 0 |
| 1 | 1 | 1 | 1 | 0 |
La operación lógica AND (también denominada ) produce un 1 (VERDADERO) sólo cuando y son 1. De lo contrario, produce 0 (FALSO). De manera similar, el OR lógico () produce 1 cuando o o ambos son 1, y 0 en caso contrario. El operador NOT () se explica por sí mismo.
Cuando se aplica a dos imágenes binarias, AND y OR operan en pares de píxeles correspondientes entre las imágenes. Es decir, son operadores por elementos en este contexto.
Los operadores AND, OR y NOT son funcionalmente completos, en el sentido de que pueden usarse como base para construir cualquier otro operador lógico.
La operación más simple que realizamos en una imagen digital es alterar la intensidad de sus píxeles individualmente usando una función de transformación, , de la forma
donde es la intensidad de un píxel en la imagen original y es la intensidad (mapeada) del píxel correspondiente en la imagen procesada. Esta transformación podría usarse, por ejemplo, para obtener el negativo de la imagen.
img = imread('figs/lena.jpg')
img = lena[:,:,1]
neg = 255 - img
plt.subplot(1,2,1), imshow(img)
plt.title('Imagen original')
plt.subplot(1,2,2), imshow(neg)
plt.title('Imagen negativa')
Text(0.5, 1.0, 'Imagen negativa')
Sea el conjunto de coordenadas de una vecindad centrada en un punto arbitrario en una imagen . El procesamiento de vecindad genera un píxel correspondiente en las mismas coordenadas en una imagen de salida (procesada) , de modo que el valor de ese píxel se determina mediante una operación específica en la vecindad de píxeles en la imagen de entrada con coordenadas en el conjunto .
Por ejemplo, supongamos que la operación especificada es calcular el valor promedio de los píxeles en una vecindad rectangular de tamaño centrada en . Las coordenadas de los píxeles en esta región son los elementos del conjunto . Podemos expresar esta operación promedio como
donde y son las coordenadas de fila y columna de los píxeles cuyas coordenadas están en el conjunto . La imagen se crea variando las coordenadas de modo que el centro de la vecindad se mueva de píxel a píxel en la imagen , y luego repitiendo la operación de vecindad en cada nueva ubicación.
import matplotlib.pyplot as plt
def show_images(*images, titles=[], cols=2, cmap='gray', figsize=(10, 10)):
"""
Display a list of images in a grid.
Args:
images (list): A list of images to display.
titles (list): A list of titles for each image (optional).
cols (int): The number of columns in the grid (default=2).
cmap (str): The colormap to use (default='gray').
figsize (tuple): The size of the figure (default=(10, 10)).
"""
rows = len(images) // cols + (1 if len(images) % cols else 0)
fig, axes = plt.subplots(rows, cols, figsize=figsize)
for i, ax in enumerate(axes.flat):
if i < len(images):
ax.imshow(images[i], cmap=cmap)
if titles is not None:
ax.set_title(titles[i] if len(titles) > i else 'Figura {}'.format(i+1))
ax.axis('off')
plt.tight_layout()
plt.show()
from scipy import ndimage as ndi
n = 11
mean_kernel = np.full((n, n), 1/n**2)
filtered_img = ndi.correlate(img, mean_kernel)
show_images(img, filtered_img )
Utilizamos transformaciones geométricas para modificar la disposición espacial de los píxeles de una imagen. Estas transformaciones se denominan transformaciones de lámina de goma porque pueden considerarse análogas a “imprimir” una imagen en una lámina de goma y luego estirar o encoger la hoja de acuerdo con un conjunto predefinido de reglas.
Las transformaciones geométricas de imágenes digitales constan de dos operaciones básicas:
La transformación de coordenadas puede ser expresada como
donde son las coordenadas de píxeles de la imagen original y son las coordenadas de píxeles correspondientes de la imagen transformada.
Nuestro interés está en las llamadas transformaciones afines, que incluyen escalado, traslación, rotación y corte. La característica clave de una transformación afín en 2-D es que conserva puntos, líneas rectas y planos. La ecuación anterior se puede utilizar para expresar las transformaciones que acabamos de mencionar, excepto la traslación, que requeriría agregar un vector bidimensional constante al lado derecho de la ecuación. Sin embargo, es posible utilizar coordenadas homogéneas para expresar las cuatro transformaciones afines utilizando una única matriz de 3 × 3 en la siguiente forma general:
Esta transformación puede escalar, rotar, trasladar o traslapar una imagen, dependiendo de los valores elegidos para los elementos de la matriz .
Una ventaja significativa de poder realizar todas las transformaciones utilizando la representación unificada, es que proporciona el marco para concatenar una secuencia de operaciones.
Por ejemplo, si queremos cambiar el tamaño de una imagen, rotarla y mover el resultado a alguna ubicación, simplemente formamos una matriz de 3 × 3 igual al producto de las matrices de escala, rotación y traducción.
Todos los enfoques de procesamiento de imágenes analizados hasta ahora operan directamente sobre los píxeles de una imagen de entrada; es decir, trabajan directamente en el dominio espacial.
En algunos casos, las tareas de procesamiento de imágenes se formulan mejor transformando las imágenes de entrada, llevando la tarea especificada en un dominio de transformación y aplicando la transformación inversa para regresar al dominio espacial.
Una clase esencial de transformadas lineales 2-D, denotada T(u,v), se puede expresar en la forma general
donde es una imagen de entrada, se denomina núcleo de transformación directa y la ecuación se evalúa para y . Como antes, e son variables espaciales, mientras que y son las dimensiones de fila y columna de . Las variables y se denominan variables de transformación. se llama transformada directa de .
Dado T (u, v), podemos recuperar f (x, y) usando la transformada inversa de T(u,v):
para y , donde se denomina núcleo de transformación inversa. Juntas, las Ecs. anteriores se denominan par de transformación.
La naturaleza de una transformación está determinada por su núcleo. Una transformación de particular importancia en el procesamiento de imágenes digitales es la transformada de Fourier, que tiene los siguientes núcleos directo e inverso:
donde , por lo que dichos núcleos son funciones complejas.
Al sustituir los núcleos anteriores en las formulaciones de transformación generales nos dan el par de transformadas discretas de Fourier:
La figura muestra una imagen corrompida por interferencia periódica (sinusoidal).
En el dominio espacial, la interferencia aparece como ondas de intensidad.
En el dominio de la frecuencia, la interferencia se manifiesta como ráfagas brillantes de intensidad, cuya ubicación está determinada por la frecuencia de la interferencia sinusoidal.
La figura también muestra una imagen de máscara (llamada filtro) en la que el blanco y el negro representan 1 y 0, respectivamente.
Se muestra el resultado final, obtenido calculando la inversa de la transformada modificada. La interferencia ya no es visible y los detalles de la imagen nunca antes vistos ahora se vuelven bastante claros.